﻿namespace Web.Base.Models
{
    public interface IViewModel
    {
        bool Status { get; set; }
        string Message { get; set; }
    }

    public class ViewModel : IViewModel
    {
        public bool Status { get; set; }
        public string Message { get; set; }

        public ViewModel()
            : this(false, null)
        {

        }
        public ViewModel(bool status)
            : this(status, null)
        {

        }
        public ViewModel(bool status, string message)
        {
            Status = status;
            Message = message;
        }
    }
    public class ViewModel<TFirst> : ViewModel
    {
        public TFirst First { get; set; }
        public ViewModel()
            : this(false, string.Empty, default(TFirst))
        {

        }

        public ViewModel(bool status)
            : this(status, string.Empty, default(TFirst))
        {

        }

        public ViewModel(TFirst data)
            : this(false, string.Empty, data)
        {

        }

        public ViewModel(bool status, TFirst data)
            : this(status, string.Empty, data)
        {

        }

        public ViewModel(bool status, string message, TFirst first)
        {
            Status = status;
            Message = message;
            First = first;
        }
    }
    public class ViewModel<TFirst, TSecond> : ViewModel<TFirst>
    {
        public TSecond Second { get; set; }
        public ViewModel(): this(false, string.Empty, default(TFirst), default(TSecond))
        {

        }
        public ViewModel(bool status): this(status, string.Empty, default(TFirst), default(TSecond) )
        {

        }
        public ViewModel(TFirst first, TSecond second): this(false, string.Empty, first, second)
        {

        }
        public ViewModel(bool status, TFirst first, TSecond second): this(status, string.Empty, first, second)
        {

        }
        public ViewModel(bool status, string message, TFirst first, TSecond second): base(status, message, first)
        {
            Second = second;
        }

    }
    public class ViewModel<TFirst, TSecond, TThird> : ViewModel<TFirst, TSecond>
    {
        public TThird Third { get; set; }

        public ViewModel(): this(false, string.Empty, default(TFirst), default(TSecond), default(TThird))
        {

        }
        public ViewModel(bool status, TThird third) : base(status)
        {
            Third = third;
        }

        public ViewModel(TFirst first, TSecond second, TThird third) : base(first, second)
        {
            Third = third;
        }

        public ViewModel(bool status, TFirst first, TSecond second, TThird third) : base(status, first, second)
        {
            Third = third;
        }

        public ViewModel(bool status, string message, TFirst first, TSecond second, TThird third) : base(status, message, first, second)
        {
            Third = third;
        }
        
    }

    public class ViewModel<TFirst, TSecond, TThird, TFourth> : ViewModel<TFirst, TSecond, TThird>
    {
        public TFourth Fourth { get; set; }
        public ViewModel(): this(false, string.Empty, default(TFirst), default(TSecond), default(TThird), default(TFourth))
        {

        }
        public ViewModel(bool status, TThird third, TFourth fourth) : base(status, third)
        {
            Fourth = fourth;
        }

        public ViewModel(TFirst first, TSecond second, TThird third, TFourth fourth) : base(first, second, third)
        {
            Fourth = fourth;
        }

        public ViewModel(bool status, TFirst first, TSecond second, TThird third, TFourth fourth) : base(status, first, second, third)
        {
            Fourth = fourth;
        }

        public ViewModel(bool status, string message, TFirst first, TSecond second, TThird third, TFourth fourth) : base(status, message, first, second, third)
        {
            Fourth = fourth;
        }
       
    }
    public class ViewModel<TFirst, TSecond, TThird, TFourth, TFifth> : ViewModel<TFirst, TSecond, TThird, TFourth>
    {
        public TFifth Fifth { get; set; }
        public ViewModel(): this(false, string.Empty, default(TFirst), default(TSecond), default(TThird), default(TFourth), default(TFifth))
        {

        }
        public ViewModel(bool status, TThird third, TFourth fourth, TFifth fifth) : base(status, third, fourth)
        {
            Fifth = fifth;
        }

        public ViewModel(TFirst first, TSecond second, TThird third, TFourth fourth, TFifth fifth) : base(first, second, third, fourth)
        {
            Fifth = fifth;
        }

        public ViewModel(bool status, TFirst first, TSecond second, TThird third, TFourth fourth, TFifth fifth) : base(status, first, second, third, fourth)
        {
            Fifth = fifth;
        }

        public ViewModel(bool status, string message, TFirst first, TSecond second, TThird third, TFourth fourth, TFifth fifth) : base(status, message, first, second, third, fourth)
        {
            Fifth = fifth;
        }

    }
}